/*******************************************************************************
* Copyright (c) 2011, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Martin W. Kirst <martin.kirst@s1998.tu-chemnitz.de> - jUnit test for Bug 361121 [Progress] DetailedProgressViewer's comparator violates its general contract
* Red Hat Inc. - Bug 474132
******************************************************************************/
package org.eclipse.ui.tests.progress;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ui.internal.progress.JobInfo;
import org.junit.Before;
import org.junit.Test;
public class JobInfoTest {
/**
* @see org.eclipse.core.internal.jobs.InternalJob
*/
static final int ABOUT_TO_RUN = 0x10;
/**
* @see org.eclipse.core.internal.jobs.InternalJob
*/
static final int ABOUT_TO_SCHEDULE = 0x20;
/**
* @see org.eclipse.core.internal.jobs.InternalJob
*/
static final int BLOCKED = 0x08;
/**
* @see org.eclipse.core.internal.jobs.InternalJob
*/
static final int YIELDING = 0x40;
private List jobinfos = new ArrayList();
@Before
public void setUp() throws Exception {
int counter = 0;
counter = createAndAddJobInfos(false, false, ABOUT_TO_RUN, counter);
counter = createAndAddJobInfos(false, true, ABOUT_TO_RUN, counter);
counter = createAndAddJobInfos(true, false, ABOUT_TO_RUN, counter);
counter = createAndAddJobInfos(true, true, ABOUT_TO_RUN, counter);
counter = createAndAddJobInfos(false, false, ABOUT_TO_SCHEDULE, counter);
counter = createAndAddJobInfos(false, true, ABOUT_TO_SCHEDULE, counter);
counter = createAndAddJobInfos(true, false, ABOUT_TO_SCHEDULE, counter);
counter = createAndAddJobInfos(true, true, ABOUT_TO_SCHEDULE, counter);
counter = createAndAddJobInfos(false, false, Job.SLEEPING, counter);
counter = createAndAddJobInfos(false, true, Job.SLEEPING, counter);
counter = createAndAddJobInfos(true, false, Job.SLEEPING, counter);
counter = createAndAddJobInfos(true, true, Job.SLEEPING, counter);
counter = createAndAddJobInfos(false, false, Job.WAITING, counter);
counter = createAndAddJobInfos(false, true, Job.WAITING, counter);
counter = createAndAddJobInfos(true, false, Job.WAITING, counter);
counter = createAndAddJobInfos(true, true, Job.WAITING, counter);
counter = createAndAddJobInfos(false, false, Job.RUNNING, counter);
counter = createAndAddJobInfos(false, true, Job.RUNNING, counter);
counter = createAndAddJobInfos(true, false, Job.RUNNING, counter);
counter = createAndAddJobInfos(true, true, Job.RUNNING, counter);
}
/**
* Test that {@link org.eclipse.ui.internal.progress.JobInfo#compareTo(Object)}
* is valid implemented and complies to the interface method contract.
*/
@Test
public void testCompareToContractCompliance() {
for(int xi = 0; xi<this.jobinfos.size(); xi++) {
JobInfo x = (JobInfo) jobinfos.get(xi);
for(int yi = 0; yi<this.jobinfos.size(); yi++) {
JobInfo y = (JobInfo) jobinfos.get(yi);
int xyResult = x.compareTo(y);
int yxResult = y.compareTo(x);
// sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y.
assertEquals(String.format("sgn(compare(%1$s, %2$s)) != -sgn(compare(%2$s, %1$s))", new Object[] { x, y}),
Math.round(Math.signum(xyResult)) , Math.round(-Math.signum(yxResult)));
for(int zi = 0; zi<this.jobinfos.size(); zi++) {
JobInfo z = (JobInfo) jobinfos.get(zi);
int xzResult = x.compareTo(z);
int yzResult = y.compareTo(z);
// ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0.
if(xyResult > 0) {
if(yzResult > 0) {
assertTrue(String.format("((compare(%1$s, %2$s)>0) && (compare(%2$s, %3$s)>0)) but not compare(%1$s, %3$s)>0", new Object[] {x, y, z}),
xzResult > 0);
}
}
else if(xyResult == 0) {
// compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z.
assertEquals(String.format("compare(%1$s, %2$s)==0 but not that sgn(compare(%1$s, %3$s))==sgn(compare(%2$s, %3$s))", new Object[]{ x, y, z}),
Math.round(Math.signum(xzResult)) , Math.round(Math.signum(yzResult)));
}
}
boolean consistentWithEquals = true;
// Optionally (compare(x, y)==0) == (x.equals(y))
if(consistentWithEquals && xyResult == 0) {
assertTrue(String.format("compare(%1$s, %2$s)==0) == (%1$s.equals(%2$s)", new Object[] {x, y}),
x.equals(y));
}
}
}
}
/**
* @param user
* @param system
* @param jobstate
* @param counter
* @return
*/
private int createAndAddJobInfos(boolean user, boolean system, int jobstate, int counter) {
TestJob job;
JobInfo ji;
job = new TestJob("Job" + (counter++));
job.setUser(user);
job.setSystem(system);
job.setPriority(Job.INTERACTIVE);
job.setInternalJobState(jobstate);
ji = new ExtendedJobInfo(job);
jobinfos.add(ji);
job = new TestJob("Job" + (counter++));
job.setUser(user);
job.setSystem(system);
job.setPriority(Job.SHORT);
job.setInternalJobState(jobstate);
ji = new ExtendedJobInfo(job);
jobinfos.add(ji);
job = new TestJob("Job" + (counter++));
job.setUser(user);
job.setSystem(system);
job.setPriority(Job.LONG);
job.setInternalJobState(jobstate);
ji = new ExtendedJobInfo(job);
jobinfos.add(ji);
job = new TestJob("Job" + (counter++));
job.setUser(user);
job.setSystem(system);
job.setPriority(Job.BUILD);
job.setInternalJobState(jobstate);
ji = new ExtendedJobInfo(job);
jobinfos.add(ji);
job = new TestJob("Job" + (counter++));
job.setUser(user);
job.setSystem(system);
job.setPriority(Job.DECORATE);
job.setInternalJobState(jobstate);
ji = new ExtendedJobInfo(job);
jobinfos.add(ji);
job = new TestJob("Job" + (counter++));
job.setUser(user);
job.setSystem(system);
job.setPriority(Job.LONG);
job.setInternalJobState(jobstate);
ji = new ExtendedJobInfo(job);
jobinfos.add(ji);
return counter;
}
}